"""
滚动时间数据分析适用于时间序列数据，例如股票价格、气象数据、传感器数据、经济指标等。
它可以帮助识别趋势、季节性模式、周期性变化和异常值，并提供对数据动态性的更全面理解。
本例我们用 pandas 来完成按分组进行操作。
"""
from io import StringIO
import pandas as pd

data = '''
A          B   C
 a 2021-01-01   1
 a 2021-01-02   2
 a 2021-01-03   3
 a 2021-01-04   5
 a 2021-01-05   6
 a 2021-01-06  10
 a 2021-01-07  12
 a 2021-01-08  14
 a 2021-01-09  12
 a 2021-01-10  30
 b 2022-01-01   1
 b 2022-01-02   2
 b 2022-01-03   3
 b 2022-01-04   4
 b 2022-01-05   5
 b 2022-01-06   6
 b 2022-01-07   7
 b 2022-01-08   8
'''
df = pd.read_csv(StringIO(data), delim_whitespace=True)
df = df.astype({"B": "datetime64[ns]"})
df.info()

# 按数据源 A 列分组，目的表 C 列的结果等于数据源 B 列 T+1～T+3 阶段的数据源 C 列的平均值。

"""
由于需要按组来进行操作，我们先对数据分析，然后每个组的 DataFrame 由一个函数来完成。
接下来我们来分析这个函数如何写。

在函数中，我们先定义一个时长为一天的时间间隔对象，
在 DataFrame 中查询当前时间的 T+1～T+3 数据，
筛选完成后再求 C 列的平均值。
"""

# =================== 逻辑思路 =========================
# 根据思路，我们先测试一个单例。先定义一个一天的时间间隔对象
day = pd.offsets.Day(1)
# print(day)  # <Day>

# 随机取一个固定的时间：
t = df.loc[0, "B"]
# print(t)  # 2021-01-01 00:00:00

# 筛选时间区间的数据：
tmp = df[df["B"].between(t + day, t + day * 3)]
# print(tmp)
"""
   A          B  C
1  a 2021-01-02  2
2  a 2021-01-03  3
3  a 2021-01-04  5
"""

# 求C列的平均值
c_mean = df[df["B"].between(t + day, t + day * 3)]["C"].mean()


# print(c_mean)  # 3.3333333333333335


# 将以上逻辑封装成一个函数
def func(df):
    """

    :param df: DataFrame
    :return: Series
    """
    day = pd.offsets.Day(1)
    foo = df.apply(lambda x: df[df["B"].between(x["B"] + day, x["B"] + day * 3)]["C"].mean(), axis=1)
    return foo


sr = df.groupby("A", group_keys=False).apply(func).fillna(0)
# group_keys=False 可以禁用分组键所形成的索引，不会删去原始对象的索引。
# print(sr)
# print(type(sr))

df = df.assign(D=sr)
print(df)
